package com.labManage.service.impl;

import com.labManage.dao.GoodsDao;
import com.labManage.dao.KindsDao;
import com.labManage.entity.Goods;
import com.labManage.entity.Kinds;
import com.labManage.entity.User;
import com.labManage.service.KindsService;
import com.labManage.vo.KindVo;
import com.labManage.vo.ResultVo;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.sql.rowset.serial.SerialBlob;
import java.io.UnsupportedEncodingException;
import java.sql.Blob;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
public class KindsServiceImpl implements KindsService {
    @Autowired
    private KindsDao kindsDao ;
    @Autowired
    private GoodsDao goodsDao;

    /***************************************************************************************************************************
     *  @fn             queryKindAll
     *  @brief          查询所有分类的service方法
     *  @type           非静态方法
     *  @detail         根据不同的条件，进行不同dao方法的调用
     *  @param[in]      无
     *  @return         List<KindVo>        返回所有分类的信息，包括分类名称，分类描述，分类图片、分类总库存，分类总量
     *  @author         杜健华，杜志华
     *  @date           2021.06.21
     ****************************************************************************************************************************/
    @Override
    public List<KindVo> queryAllKind() throws SQLException, UnsupportedEncodingException {
        //查询数据库中所有的分类信息
        List<Kinds> kinds = kindsDao.selectKinds();
        //如果查询不为空，则获取详细信息
        if(null!=kinds){
            //声明一个集合来存储所有分类信息
            List<KindVo> kindVoList = new ArrayList<>();
            //遍历查询结果
            for (Kinds k:kinds) {
                //将数据库中blob类型用java的byte[]数组类型字段接收后转为字符串，因为前端的图片信息是存放在src中，该属性值为一个字符串
                String imageStr =  new String(k.getKindsImage(),"utf-8");
                KindVo kindVo = new KindVo();

                kindVo.setId(k.getId());
                //得到分类名称
                kindVo.setKindsName(k.getKindsName());
                //得到分类描述
                kindVo.setKindsDesc(k.getKindsDesc());
                //得到分类图片，格式为字符串
                kindVo.setKindsImageStr(imageStr);
                //查询指定分类的总数量
                long allKindsTotal = goodsDao.selectGoodsTotalByKindsId(k.getId());
                kindVo.setKindsAllNum(allKindsTotal);
                //查询指定分类的总库存量
                long allKindsRest = goodsDao.selectGoodsRestByKindsUsernameAndGoodsState(k.getKindsName());
                kindVo.setKindsRestNum(allKindsRest);
                kindVoList.add(kindVo);
            }
            return kindVoList;
        }else{
            return null;
        }
    }

    /***************************************************************************************************************************
     *  @fn             addKinds
     *  @brief          增加分类信息的service方法
     *  @type           非静态方法
     *  @detail         接收Controller的参数，进行相应dao方法的调用
     *  @param[in]      Kinds kinds         需要增加的分类信息，包括分类名称，分类描述，分类图片
     *  @return         1   插入成功
     *                  0   插入不成功
     *  @author         杜健华，杜志华
     *  @date           2021.06.21
     ****************************************************************************************************************************/
    @Override
    public int addKinds(Kinds kinds) throws UnsupportedEncodingException, SQLException {
        //根据分类名称查询该分类是否存在
        Kinds kindsInfo = kindsDao.selectKindsByKindsName(kinds.getKindsName());
        //如果查询结果不为空，说明存在，则返回0，controller 继续判断
        if(null!=kindsInfo){
            return 0;
        //如果查询结果不为空，则执行相应的dao方法
        }else{
            //因为前端是将<imag>标签中src属性值，也就是字符串传给controller的，而数据库是以blob类型存储，但是Java字段对应数据库中blob
            // 类型的类型为byte[],所以此处也需要转换才能存入对象中
            //kinds.setKindsImage(kinds.getKindsImageStr().getBytes("utf-8"));
            kinds.setCreateTime(new Date());
            kinds.setModifyTime(new Date());
            Subject subject = SecurityUtils.getSubject();
            User loginUser = (User)subject.getPrincipal();
            kinds.setCreatePerson(loginUser.getUsername());
            kinds.setModifyPerson(loginUser.getUsername());
            int result = kindsDao.insertKinds(kinds);
            return result;
        }
    }
    @Override
    public Kinds getKindsByKindsName(String kindsName) throws UnsupportedEncodingException {
        Kinds kinds = kindsDao.selectKindsByKindsName(kindsName);
        String imageStr =  new String(kinds.getKindsImage(),"utf-8");
        kinds.setKindsImageStr(imageStr);
        return kinds;
    }

    @Override
    public List<KindVo> queryKindAllLimit(Integer page, Integer limit) throws UnsupportedEncodingException {
        int startIndex = (page-1)*limit;
        List<Kinds> kinds = kindsDao.selectKindsAllLimit(startIndex,limit);
        List<KindVo> kindVoList = new ArrayList<>();
        for (Kinds k:kinds ){
            //将数据库中blob类型用java的byte[]数组类型字段接收后转为字符串，因为前端的图片信息是存放在src中，该属性值为一个字符串
            String imageStr =  new String(k.getKindsImage(),"utf-8");
            KindVo kindVo = new KindVo();
            kindVo.setId(k.getId());
            //得到分类名称
            kindVo.setKindsName(k.getKindsName());
            //得到分类描述
            kindVo.setKindsDesc(k.getKindsDesc());
            //得到分类图片，格式为字符串
            kindVo.setKindsImageStr(imageStr);
            //查询指定分类的总数量
            long allKindsTotal = goodsDao.selectGoodsTotalByKindsId(k.getId());
            kindVo.setKindsAllNum(allKindsTotal);
            //查询指定分类的总库存量
            long allKindsRest = goodsDao.selectGoodsRestByKindsUsernameAndGoodsState(k.getKindsName());
            kindVo.setKindsRestNum(allKindsRest);
            kindVoList.add(kindVo);
        }
        return kindVoList;
    }

    @Override
    public List<Kinds> getAllKindsLimit(Integer page, Integer limit, Kinds condition) {
        int startIndex = (page-1)*limit;
        List<Kinds> kinds = kindsDao.selectAllKindsLimit(startIndex,limit,condition);
        return kinds;
    }

    @Override
    public int modifyKindsInfo(Kinds kinds) {
        Kinds selectKinds = kindsDao.selectKindsByKindsName(kinds.getKindsName());
        if(selectKinds!=null){
            Long id = selectKinds.getId();
            if(id==kinds.getId()){
                Subject subject = SecurityUtils.getSubject();
                User loginUser = (User)subject.getPrincipal();
                kinds.setModifyPerson(loginUser.getUsername());
                kinds.setModifyTime(new Date());
                int result =  kindsDao.updateKinds(kinds);
                return result;
            }else{
                return -1;
            }
        }else{
            Subject subject = SecurityUtils.getSubject();
            User loginUser = (User)subject.getPrincipal();
            kinds.setModifyPerson(loginUser.getUsername());
            kinds.setModifyTime(new Date());
            int result =  kindsDao.updateKinds(kinds);
            return result;
        }
    }

    @Override
    public int deleteKindsInfoById(Long id) {
        List<Goods> goods = goodsDao.selectAllGoodsByKindsId(id + "");
        if((goods!=null&&goods.size()==0)){
           int result =  kindsDao.deleteKindsInfoById(id);
           return result;
        }else{
            return 0;
        }
    }
}
